【BUUCTF】web(第1页wp)
本文最后更新于:2023年8月25日 下午
[TOC]
[极客大挑战 2019]EasySQL
我们登录的时候使用bp抓包,我们尝试从密码进行sql注入
由于密码是字符串,所以我们尝试使用单引号闭合,然后使用万能密码 or 1=1 #
直接成功了
payload:
1 |
|
[HCTF 2018]WarmUp
进来后看到一个表情,我们查看源代码:
提示我们去 source.php
于是,访问source.php:
我们先对 file 传参 hint.php:
提示 flag 在 : ffffllllaaaagggg
然后我们要分析 checkFile() 这个函数:
1 |
|
大概意思就是说,file参数的值,问号?之前的值一定是 $whitelist
数组中的元素,如果没有问号?函数会帮我们加上,返回问号?之前的值,如果在 $whitelist
数组中,则返回true
于是我们可以初步构造: ?file=hint.php?/../../ffffllllaaaagggg
但是没有任何反应,可能是因为 flag的路径不对,我们可以多往外查看几层,多加几个 ../
尝试了几次后,就得到了flag(此处我们使用相对路径去包含flag)
[极客大挑战 2019]Havefun
查看源代码,只需使用get传参使 cat=dog 即可:
[ACTF2020 新生赛]Include
进入页面,发现有一个 tips 链接,点一下:
发现url中file的参数是 flag.php
结合题目名称,我们知道这是文件包含漏洞
我们直接使用 php://filter
伪协议,将flag.php 转为base64编码,然后base64解密即可:
payload:
1 |
|
[ACTF2020 新生赛]Exec
打开页面,发现可以使用 ping 命令,于是我们知道,这是命令执行
我们先用bp抓包:
修改target,linux命令执行,我们可以使用 ;
|
进行分隔:
发现flag在根目录下,直接cat查看
[强网杯 2019]随便注
我们先判断闭合情况,先用bp抓包:
发现可以使用单引号闭合,接着我们判断字段数:
发现表中只有两列
接着我们想要使用联合查询去判断回显情况:
结果发现select等语句被过滤了,我们发现这样就查询不了数据了。。。
然后经过尝试,我们发现可以进行 堆叠注入
,我们先查数据库:
然后,我们查询当前数据库有哪些表:
然后分别查询两个表的字段,我们先查 words
表:
1 |
|
然后我们查询 1919810931114514
表的列名
我们发现,如果直接 0';show columns from 1919810931114514;%23
的话,是查询不到数据的。
MySQL反引号: ` 它是为了区分MYSQL的保留字与普通字符而引入的符号。
有MYSQL保留字作为字段的,必须加上反引号来区分。
我们需要将该表名加上反引号:
1 |
|
查询到该表下有一个 flag 字段。
禁用了 select 怎么查询数据呢?
方法一:
我记得mysql中有一个可以查询数据的语句 : handler
mysql除可使用select查询表中的数据,也可使用handler语句,这条语句使我们能够一行一行的浏览一个表中的数据,不过handler语句并不具备select语句的所有功能。它是mysql专用的语句.
基本语法:
1 |
|
于是我们可以使用 handler 语句去查看数据:
先打开,然后查看,接着关闭:
payload:
1 |
|
成功查询到flag。我觉得 handler 挺重要的。
方法二:
我们可以使用 mysql 预处理语句:
1 |
|
首先,我们先使用 @ 定义变量:
1 |
|
然后我们使用 prepare 编译,使用execute执行:
1 |
|
解释:
1 |
|
于是:
方法三:
可以使用改表明,列名的方法。
[SUCTF 2019]EasySQL
https://blog.csdn.net/mochu7777777/article/details/108937396
[GXYCTF2019]Ping Ping Ping
使用bp抓包,易知,这是一道命令执行题.
我们使用 ;
分隔,使用ls
查看当前目录下的文件:
发现flag.php 在当前目录,于是我们使用 cat
查询flag
发现好像被过滤了。
去掉 * 发现空格也被过滤了
我们使用 ${IFS} 代替空格
发现 {}
被过滤了 ,于是我们使用 $IFS$9
代替
正常了,但是flag被过滤了。
解法一:
我们可以尝试内联执行
: 将一次的执行结果当作另一次执行的输入
payload:
1 |
|
反引号括起来的
ls` 先执行,得到 flag.php 和 index.php
然后,cat后执行,将flag.php和index.php的内容都输出了
解法二:
我们先通过cat查看index.php的源码:
payload:
1 |
|
index.php:
1 |
|
我们可以使用 字符串拼接绕过
,payload:
1 |
|
变量 a=fl 变量 b=ag.php 然后cat时我们使用 $b$a 将值给取出来,并拼接成flag.php
方法三:
这里过滤了bash,但是我们还可以使用 sh
, payload:
1 |
|
payload意思就是,我们先将 base64后的值 Y2F0IGZsYWcucGhw
作为 base64 -d
的输入,这时就被解码成 cat flag.php 了,然后作为 sh 脚本进行命令执行
[极客大挑战 2019]Secret File
查看源代码,进入到 /Archive_room.php
中
点击 secret 时使用bp抓包:
发现了 secr3t.php
,我们进入这个页面:
得到了一串代码,审计一下,发现没有过滤 php://filter
于是可以使用伪协议读取源代码:
payload:
1 |
|
base64解码得到flag
[极客大挑战 2019]LoveSQL
我们登录时使用bp抓包:
修改 密码为万能密码:' or 1=1%23'
我们发现登录成功,并且有回显,接着我们查看表中字段数: ' order by 3%23
发现共有三列,接着判断回显:
第2、3列会回显,然后就使用联合查询查询:数据库、表、列、数据:
查询数据库:
1 |
|
查询表:
1 |
|
查询字段:
payload:
1 |
|
查询password字段数据:
1 |
|
得到flag
[极客大挑战 2019]Knife
解法一:
直接使用蚁剑连接找 flag
解法二:
使用命令执行:
[极客大挑战 2019]Http
查看源代码:发现 /Secret.php
访问一下:
我们先使用bp抓包:
他说不来自这个网址,说明可能检查的是 Referer
头
我们加一下就行:
然后又说需要使用这个浏览器,可能检查的是 UA,我们也改一下:
然后又说,需要从本地阅读,可能是检查ip地址,我们尝试 X-Forwarded-For
:
[极客大挑战 2019]Upload
文件上传题目,我们先上传一张内容为aaa的png图片:
发现上传不了,我们猜测可能是图片内容检测,于是我们加上GIF文件头:GIF89a
发现上传成功了,上传路径为: /upload/
然后我们修改png图片内容为图片马:
然后提示说,不能带有 <?
,但是我们知道 php的另一种格式:
1 |
|
上传成功!
但是png图片怎么执行脚本呢?不行的,我们可以尝试其他后缀 php php3 php5 phtml
发现phtml可以上传,然后我们访问 /upload/a.phtml:
发现可行,于是使用蚁剑连接得到flag
[ACTF2020 新生赛]Upload
上传一个文件然后抓包:
经过尝试,我们可以上传 phtml
后缀文件,内容写一句话木马,上传成功。
然后使用命令执行拿到flag:
[极客大挑战 2019]BabySQL
登录使用bp抓包,然后我们去判断闭合:
使用单引号报错,说明可以使用单引号闭合。
然后我们去判断字段数:
报错提示 der 3
我们不是 order by 3
吗?怎么变这样了,我们猜测可能将这些关键字替换为空了,使用双写绕过:
判断出字段有三个,然后我们使用联合查询判断回显,发现很多关键字也被过滤了,需要双写绕过:
判断出第2、3列回显,于是依次查询数据库、表、列、数据:
1 |
|
1 |
|
1 |
|
[极客大挑战 2019]PHP
根据提示,备份网站,所以我们访问 /www.zip
获得 网站源码:
然后审计 class.php:
1 |
|
发现析构方法中,如果密码=100&用户名=admin就会输出flag
我们在 index.php 中可以传参:
1 |
|
意思就是需要我们传递一个序列化的对象。但是我们知道,反序列化之前会调用 __wakeup() 方法,这会导致admin=guest,这样就不能输出flag了。
我们如何绕过 __wakeup() 方法呢?
由于当前 php 版本是 5.3.3 。存在 wakeup 漏洞:
漏洞影响版本:
PHP5 < 5.6.25
PHP7 < 7.0.10
漏洞产生原因:
如果存在__wakeup方法,调用 unserilize() 方法前则先调用__wakeup方法,但是序列化字符串中表示对象属性个数的值大于 真实的属性个数时会跳过__wakeup的执行
于是我们可以构造序列化对象:
1 |
|
1 |
|
注意:要将属性值改为大于真实属性个数
然后我们传参发现,居然没有用!
仔细观察payload发现,属性的长度与真实长度好像对不上,于是去查阅资料得知:
PHP——serialize()序列化类变量public、protected、private的区别
public无标记,变量名不变,长度不变: s:2:”op”;i:2;
protected在变量名前添加标记%00*
%00,长度+3: s:5:”%00*%00op”;i:2;
private在变量名前添加%00(classname)%00,长度+2+类名长度: s:17:”%00FileHandler_Z%00op”;i:2;
所以我们需要在 变量名的 类名前后都添加 \00
,这样长度就对上了:
1 |
|
得到flag
[ACTF2020 新生赛]BackupFile
我们经过尝试,发现备份文件 /index.php.bak:
1 |
|
代码审计知:我们需要get传参一个数字,并且 == 123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3
由于php弱比较,所以 当数字与字符串进行判断时,字符串的数值相当于第一次出现字母前的数字,若没有数字,则字符串 == 0
因此,我们传参 key=123 即可
[RoarCTF 2019]Easy Calc
首先查看页面源代码,发现存在 /calc.php
访问它,得到源码:
1 |
|
然后我们代码审计,发现使用了 eval() 函数,我们可以进行代码执行漏洞。
但是经过尝试,我们发现如果参数num中存在字母的话,就会禁止访问:
我之前一直以为,waf只在php代码中体现,但是这里的话,waf我们是看不到的
我们假设waf不允许 num 参数中存在字母,我们可以在num前加一个空格 : num
这样的话,利用 php字符串解析特性 ,可能waf会将 变量名中的空白符给去除、或者变成下滑线_
num前添加空格之后就可以输入字母了,此时我们使用scandir() 扫描根目录下的文件,但是引号’’和斜杠/被过滤了。怎么办?此时我们可以考虑使用 chr() 函数,将 / 的ascii码47 转换为 / ,扫描到了flag的位置。
然后我们使用 file_get_contents() 函数读取文件内容:
1 |
|
使用 chr() 函数去拼接 /f1agg
我们知道PHP将查询字符串(在URL或正文中)转换为内部$_GET或的关联数组$_POST。例如:/?foo=bar变成Array([foo] => “bar”)。值得注意的是,查询字符串在解析的过程中会将某些字符删除或用下划线代替。例如,/?%20news[id%00=42会转换为Array([news_id] => 42)。如果一个IDS/IPS或WAF中有一条规则是当news_id参数的值是一个非数字的值则拦截,那么我们就可以用以下语句绕过:
/news.php?%20news[id%00=42”+AND+1=0–
上述PHP语句的参数%20news[id%00的值将存储到$_GET[“news_id”]中。
HP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:
1
2
31.删除空白符
2.将某些字符转换为下划线(包括空格)
[极客大挑战 2019]BuyFlag
首先进入 payFlag页面:
发现了几个限制条件:
You must be a student from CUIT!!!
You must be answer the correct password!!!Flag need your 100000000 money
查看源代码发现:
我们可以post提交一个password,弱类型比较,我们传参:404a
首先先用bp抓包:
发现urse=0,我们修改为1时,发现我们满足了一个条件。
然后我们修改请求方式为post,并传参 404a,接着我们post传参money:100000000
提示说数字长度太长,于是我们使用科学计数法:1e9
[护网杯 2018]easy_tornado
打开网站发现有三个链接:
不知道如何下手,然后注意到题目:tornado
这是一个python框架。
于是我们猜测,这可能是模板注入。
当我们将url后面的值修改时,会报错:
在tornado模板中,存在一些可以访问的快速对象,这里用到的是handler.settings,handler 指向RequestHandler,而RequestHandler.settings又指向self.application.settings,所以handler.settings就指向RequestHandler.application.settings了,
于是我们在msg参数中传参 {{handler.settings}}
得到cookie_secret得值
然后我们只需要将 /fllllllllllllag
md5编码,与 cookie_secret连接在一起后再一次编码即可:
[BJDCTF2020]Easy MD5
bp抓包,发现响应头中有hint:
1 |
|
我们传进来的参数被放到md5()函数中了,这时,我们想起了sql注入中的md5绕过。
选一个字符串,md5之后带有 ' or
等字符的就可以进行绕过。
当然必须md5()函数的第二个参数为true:
md5(string,raw)
参数 | 描述 |
---|---|
string | 必需。要计算的字符串。 |
raw | 可选。 默认不写为FALSE。32位16进制的字符串TRUE。16位原始二进制格式的字符串 |
1 |
|
这里需要注意的是,当raw项为true时,返回的这个原始二进制不是普通的二进制(0,1),而是 'or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c
这种。
ffifdyop
这个字符串就可以进行绕过。
我们访问 /levels91.php
查看源码:
php md5() 函数绕过,我们可以传入两个数组,md5()处理不了数组会返回NULL,于是 NULL==NULL 实现绕过。
和上面一样的方法:
[HCTF 2018]admin
我们注册登录账号之后,在change页源代码中发现了提示:
下载后打开,发现这是一个flask框架。由于题目说admin才能有用,于是我们在文件中找到了admin账号、密码。
我们对网页进行抓包,发现session:
发现有个 flask session
加密,但是 session 可以伪造
我们可以使用脚本,但是想要伪造的话,需要一个key,我们在 config.py 中找到了:
如图,解密出来了,我们只需要把用户名换成 admin 在编码为 session即可:
然后首页把session替换一下即可:
[ZJCTF 2019]NiZhuanSiWei
1 |
|
代码审计一下,此处考点是文件包含漏洞
text 参数可以使用 php://input 伪协议
,或者使用 data 伪协议
payload:
1 |
|
file参数提示要包含 useless.php ,于是我们可以先使用 php://filter 伪协议
读取源码:
1 |
|
1 |
|
读取到了useless.php 源码,发现有一个 __tostring() 方法,我们在输出对象时会调用该方法,
我们再分析一下 index.php ,发现我们传的参数 password需要序列化。
因此,我们需要创建一个 Flag 对象, $file=flag.php 即可。
1 |
|
[MRCTF2020]你传你🐎呢
我们首先上传一张图片马:
然后我们上传 .htaccess
文件 ,目的是将 png 文件以 php脚本进行解析:
1 |
|
然后使用蚁剑连接即可:
[极客大挑战 2019]HardSQL
我们从密码处测试,发现很多被过滤了(可以使用fuzz),union,if被过滤了,所以不能使用联合查询,bool盲注等方法了。并且空格过滤了,/**/
%0a
等方法都不行,我们只用一种方法了,使用 () 去分隔:
括号是来包含子查询的,任何可以计算出结果的语句都可以用括号围起来,而括号的两端,可以没有多余的空格
我们使用 'or(1)%23
登录成功,但是没有回显。我们错误信息会显示出来,因此我们可以使用报错注入
此处使用 updatexml()
查询表名:
1 |
|
查询字段名:
1 |
|
查询 password字段数据:
1 |
|
此时我们发现只显示出来一部分,我们尝试使用 substr()、mid()等函数,发现被过滤了。
但是我们还可以使用 left()、right()函数,这里只能使用right()
1 |
|
得到flag
[MRCTF2020]Ez_bypass
md5()函数传数组返回空NULL,实现绕过。
passwd=1234567a(php弱类型比较)
[SUCTF 2019]CheckIn
文件上传题,首先我们先上传一张内容为:aaa的图片:
发现它检查了文件的内容,于是我们加上GIF图片的头,发现上传成功:
发现上传图片马没有用,说包含了 <?
,于是我们可以采用另一种形式:< script>
我们发现,同级目录下存在 index.php ,于是,我们可以上传 .user.ini
文件,
这样的话会把我们指定的后缀包含进同级目录下的 php 文件中:
然后使用蚁剑连接一下即可。
[网鼎杯 2020 青龙组]AreUSerialz
1 |
|
分析代码,我们可以使用 php弱类型比较绕过 __destruct() 方法将 op->1.
并且只要 $filename=”flag.php” 就可以读取到 源码,得到 flag了。
但是此处有一个问题,将 protected修饰的变量序列化之后,会产生不可见字符\00*\00
,这样我们无法绕过 is_valid()检查
我们可以将其先改为public修饰,这样就可以了。
1 |
|
1 |
|
传参给str,成功得到flag:
对于PHP版本7.1+,对属性的类型不敏感,我们可以将protected类型改为public,以消除不可打印字符
[GXYCTF2019]BabySQli
登录的时候抓包:
发现源码中有一串编码(字母大写+数字) 这是 base32编码
于是我们去解密,得到 base64编码,再解密得到:
1 |
|
我们尝试使用 ‘ 闭合: 使用 Or (or被过滤了)
我们发现密码错误,然后我们使用 Order by
判断出字段数为 3
我们发现 () 被过滤了,玩毛。
然后,这题的逻辑是这样的:
首先将 输入的username进行数据库查询,如果username为 admin,查询出密码,并且将密码pw与其比较,相等则查询成功。(一般查询出的密码会被加密)
我们需要知道一个知识点:
union做查询时,查询的数据不存在,那么联合查询就会创建一个虚拟的数据存放在数据库中
由于查询到字段数为3,我们猜测表的结构 : id,username,password ,password的加密方式为md5
于是我们可以构造:
1 |
|
由于前面一条查询 username=’’ 查询不到数据,但是我们的联合查询构造了一个虚拟数据并且返回。
经过判断,username=admin,password =md5(pw)
那么登录正确,拿到flag
[GXYCTF2019]BabyUpload
我们上传一张png图片马:
发现不行,可能对文件内容进行了检测,我们添加GIF文件头 GIF89a
还是不行,可能过滤了php关键字,我们把php换成 =
还是不行,我们换一种php脚本写法:
额,还是不行,可能是不能上传png图片,我们把文件类型换成jpg试一下:
成功了。
然后我们上传 .htaccess
(apache服务器)把png解析为php
1 |
|
然后我们访问 a.png,发现已经成功解析了,只要使用蚁剑连接即可。
[GYCTF2020]Blacklist
很多都过滤了,select也过滤掉了。只能使用堆叠注入了。
查数据库名:
1 |
|
查询表名:
查询表 FlagHere 的列名:
1 |
|
发现flag在表 FlagHere 的flag字段下。
但是select都被过滤了。我们可以使用不用select查询数据的方法,预编译prepare,handler等。
但是 prepare被过滤了。我们只能使用 mysql中 handler
了:
1 |
|
[CISCN2019 华北赛区 Day2 Web1]Hack World
1 |
|
使用 bool盲注,注意 sleep,否则访问太快,状态码为429.
此处我们要将 分割出来的字符,使用 ascii() 函数转换为ascii码(不转的话,此处会检测到sql注入)